热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RocketMQ|解耦、异步、削峰原理解析

文章目录前言先说说MQ的作用:一、RocketMQ的组成二、RocketMQ的整体架构三、RocketMQ有序消息乱序现象参考前言开门见山的说,MQ肯


文章目录

        • 前言
        • 先说说MQ的作用:
        • 一、 RocketMQ的组成
        • 二、RocketMQ的整体架构
      • 三、RocketMQ有序消息
        • 乱序现象
        • 参考


前言

开门见山的说,MQ肯定是有用的,不然这么多人用它干嘛(当然可能有人觉得可以装逼用2333)
在这里插入图片描述
不过这次我们要说的RocketMQ可不是美国进口的技术,是阿里巴巴捐赠给apache,让apache孵化用的。

RocketMQ提供at least once的语义,消息不会丢,但是有可能重复,业务上如果对重复接受度低的话,需要在业务层面规避重复带来的影响,比如去重或者幂等

阿里巴巴官方给出的RocketMQ的特点


  • 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。
  • Producer、Consumer、队列都可以分布式。
  • Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。
  • 能够保证严格的消息顺序
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力
  • 较少的依赖

先说说MQ的作用:


  • 解耦
    假如现在两个系统,当B系统crash掉,A系统也就凉了,这就是耦合带来的问题。
    在这里插入图片描述
    假如我现在用消息队列,就是这样子的。
    在这里插入图片描述
    即使B系统crash,A系统照常运行,A只需要把消息给到消息队列就可以。
  • 异步
    假如现在有这么个业务场景,分别有三个系统,用户支付成功后,支付系统调用生成订单系统来生成订单,再继续调用通知用户业务系统,最后返回给支付系统,是不是支付系统要等半天?

用户就想了,我tm等半天才能下个单,以后不在你这买了,这就损失了一名客户
在这里插入图片描述
加上消息队列会咋样?
在这里插入图片描述
依然是一个链式调用,不同的是,这次支付系统把任务信息告诉消息队列就可以了,剩下的事情,他就不管了,而是又消息队列和其他系统合作去完成。


  • 削峰
    RocketMQ可是阿里巴巴拿来抗双十一的中间件,你说刚不刚?

我们都知道,如果同时给服务器本不该承受的压力,它就会宕机。

而消息队列在削峰方面的思想就是,把大量的订单都放到消息队列里,挨个去处理,这样的结果可能是有的用户下单要等的久一些才能成功,但是好处就在于服
务器不会凉凉鸭,如果凉了,还卖啥?


一、 RocketMQ的组成

在这里插入图片描述


  • Message : 消息

  • Broker: RocketMQ的核心模块,负责接收并存储消息。

  • NameServer: RocketMQ的注册中心,集群的Topic-Queue的路由配置;Broker的实时配置信息。其它模块通过Nameservr提供的接口获取最新的Topic配置和路由信息。

  • Topic :用于将消息按主题做划分,Producer将消息发往指定的Topic,Consumer订阅该Topic就可以收到这条消息。Topic跟发送方和消费方都没有强关联关系,发送方可以同时往多个Topic投放消息,消费方也可以订阅多个Topic的消息。在RocketMQ中,Topic是一个上逻辑概念。消息存储不会按Topic分开。

  • Tag: 标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息,Tag也可以对消息进行快速的过滤,例如后面consumer在subscribe的时候可指定tag,如果不需要过滤,设置为*即可。

  • Producer:消息的生产者

  • Consumer:消息的消费者


二、RocketMQ的整体架构

在这里插入图片描述
从上面抽象来看,RocketMQ的原理在于:


  • 生产者将消息给到队列(Broker)
  • 队列中的消息在逻辑上是以Topic来分类的,进一步还可以通过Tag来过滤
  • 消费者消费消息
    在这里插入图片描述

从下面这个图,可以看到Rocket MQ天生就是分布式的,Broker作为存储消息的核心组件,支持主从机制,一个挂了,我还有备用呢。

无论是Broker还是Name Server 都可以做分布式,从而让整个系统变得高可用
在这里插入图片描述


  • 每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
  • Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息。
  • Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息。

三、RocketMQ有序消息

实现顺序消费消息,需要把这些消息放到同一个queue中,所以需要指定相同的partition key

并设置orderly=true


乱序现象


  • 双机房容灾:容灾切换的时候,会切换机房,故障恢复后,会消费故障出现前的数据,此时无法保证有序
  • 扩容:扩容会导致queue增加,导致不同queue中可能出现相同的key,不能保证有序性

参考

https://www.cnblogs.com/qdhxhz/p/11094624.html
http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/

本人水平有限,希望各位不吝赐教。


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
jzcpojwmds_652
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有